package org.bibpessoal.daos;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.bibpessoal.entidades.UserSession;
import org.bibpessoal.entidades.Usuario;
import org.bibpessoal.util.Dao;
import org.bibpessoal.util.IDao;

public class UsuarioDAO extends Dao implements IDao {

	@Override
	public boolean salvar(Object obj) {

		if(!(obj instanceof Usuario)){
			super.imprimeErro("Erro com a instancia: ","Classe diferente de usuario");
			return false;
		}


		try {

			super.iniciarConexao();
			String sql = "insert into usuario (nome, login, senha, email, foto, webSite, cidade, descricao)"
					+"values(?,?,?,?,?,?,?,?)";

			PreparedStatement stmt = (PreparedStatement) super.getCon().prepareStatement(sql);

			stmt.setString(1,((Usuario)obj).getNome());
			stmt.setString(2,((Usuario)obj).getLogin());
			stmt.setString(3,((Usuario)obj).getSenha());
			stmt.setString(4,((Usuario)obj).getEmail());
			stmt.setBytes(5,((Usuario)obj).getFoto());
			stmt.setString(6,((Usuario)obj).getWebSite());
			stmt.setString(7,((Usuario)obj).getCidade());
			stmt.setString(8,((Usuario)obj).getDescricao());

			stmt.execute();
			stmt.close();
			return true;

		} catch (SQLException e) {
			super.imprimeErro("Erro ao salvar usuario", e.getMessage());
			return false;
		}
	}

	@Override
	public boolean alterar(Object obj) {

		if(!(obj instanceof Usuario)){
			super.imprimeErro("Erro com a instancia: ","Classe diferente de usuario");
			return false;
		}
		
		try{
			super.iniciarConexao();

			String sql = "update usuario set nome=?, login=?, senha=?, email=?, foto=?, "
					+ "webSite=?, cidade=?, descricao=? where idUsuario = ?";

			System.out.println(sql);

			PreparedStatement stmt = (PreparedStatement) super.getCon().prepareStatement(sql);

			stmt.setString(1,((Usuario)obj).getNome());
			stmt.setString(2,((Usuario)obj).getLogin());
			stmt.setString(3,((Usuario)obj).getSenha());
			stmt.setString(4,((Usuario)obj).getEmail());
			stmt.setBytes(5,((Usuario)obj).getFoto());
			stmt.setString(6,((Usuario)obj).getWebSite());
			stmt.setString(7,((Usuario)obj).getCidade());
			stmt.setString(8,((Usuario)obj).getDescricao());
			stmt.setInt(9,((Usuario)obj).getId());

			stmt.execute();
			stmt.close();
			return true;

		}
		catch (SQLException e) {  
			super.imprimeErro("Erro ao alterar usuario", e.getMessage());
			return false;
		} 
	}
	
	@Override
	public boolean deletar(Integer codigo) {
		
		try{
			super.iniciarConexao();
			
			String sql = "delete from usuario where idUsuario = ?";
			
			System.out.println(sql);

			PreparedStatement stmt = (PreparedStatement) super.getCon().prepareStatement(sql);

			stmt.setInt(1, codigo);

			stmt.execute();
			stmt.close();
			return true;
		}
		catch (SQLException e) {  
			super.imprimeErro("Erro ao deletar usuario", e.getMessage());
			return false; 
		} 
	}

	@Override
	public Object carregar(Integer codigo) {

		try {

			super.iniciarConexao();
			ResultSet rs;
			Usuario user = null;

			String SQL = "select * from Usuario where idUsuario = "+codigo;

			System.out.println(SQL+"//Carrega um usuario com todos os dados na memoria."); 

			PreparedStatement ps = super.getCon().prepareStatement(SQL);
			rs = ps.executeQuery();
			while (rs.next()) {  

				user = new Usuario();
				user.setId(rs.getInt("idUsuario"));
				user.setNome(rs.getString("nome"));
				user.setLogin(rs.getString("login"));
				user.setEmail(rs.getString("email"));
				user.setSenha(rs.getString("senha"));
				user.setWebSite(rs.getString("webSite"));
				user.setCidade(rs.getString("cidade"));
				user.setDescricao(rs.getString("descricao"));
				user.setFoto(rs.getBytes("foto"));
			}
			return user;
		} catch (SQLException e) {  
			super.imprimeErro("Erro ao buscar usuario", e.getMessage());
			return null;
		}
	}

	public List<Usuario> listar() {

		try {

			super.iniciarConexao();
			ResultSet rs;
			Usuario user = null;
			List<Usuario> usuarios = new ArrayList<Usuario>();

			String SQL = "select idUsuario, nome from Usuario";

			System.out.println(SQL+"//Lista todos usuarios em uma tabela."); 

			PreparedStatement ps = super.getCon().prepareStatement(SQL);
			rs = ps.executeQuery();
			while (rs.next()) {  

				user = new Usuario();
				user.setId(rs.getInt("idUsuario"));
				user.setNome(rs.getString("nome"));
				usuarios.add(user);
			}
			return usuarios;
		} catch (SQLException e) {  
			super.imprimeErro("Erro ao buscar usuario", e.getMessage());
			return null;
		}
	}

	public UserSession autenticar(String login, String senha) {  

		try {
			super.iniciarConexao();
			ResultSet rs;
			UserSession usr = null;
			String SQL = "SELECT idUsuario,nome FROM usuario WHERE login=? and senha=?";
			System.out.println(SQL);
			PreparedStatement ps = super.getCon().prepareStatement(SQL);
			ps.setString(1, login);
			ps.setString(2, senha);
			rs = ps.executeQuery();
			while (rs.next()) {  
				usr = new UserSession();
				usr.setId(rs.getInt("idUsuario"));
				usr.setNome(rs.getString("nome"));
				usr.setAtivo(false);
			}
			return usr;
		} catch (SQLException e) {  
			super.imprimeErro("Erro ao buscar usuario", e.getMessage());
			return null;
		}  
	}
}
